package com.sanyou.service;

import com.github.pagehelper.PageInfo;
import com.sanyou.pojo.Product;
import com.sanyou.pojo.SearchHistory;
import com.sanyou.pojo.VerticalityData;
import com.sanyou.pojo.dto.ProductInfoDTO;
import com.sanyou.pojo.dto.SimpleProductDTO;
import com.sanyou.pojo.vo.MaintainDataVo;
import com.sanyou.pojo.vo.ProductCountVo;
import com.sanyou.pojo.vo.ProductNumVo;
import com.sanyou.pojo.vo.ProductVo;
import com.sanyou.utils.PagedResult;

import java.util.Date;
import java.util.List;

/**
 * 用于提供阴极板信息相关的服务接口
 * User: asus
 * Date: 2021-12-14
 * Time: 13:36
 * Version:V1.0
 */
public interface ProductService {
    /**
     * 根据条件参数获取符合条件的阴极板信息列表
     * @param productCode 阴极板编码,模糊查询,为null时不作为条件
     * @param productState 阴极板状态,为null时不作为条件
     * @param maintainType 维修类型,为null时不作为条件
     * @param orderId 订单id,查询范围为该订单下所有阴极板,为null时不作为条件
     * @param projectId 项目id,查询范围为该项目下所有阴极板,为null时不作为条件
     * @param factoryId 工厂id,查询范围为该工厂下所有阴极板,为null时不作为条件
     * @param subFactoryId 车间id,查询范围为该车间下所有阴极板,为null时不作为条件
     * @param userid 用户id,查询范围为用户所具有数据查看权限的所有工厂和车间范围内的阴极板,为null时不作为条件
     * @return
     */
    List<ProductVo> listProductInfo(String productCode, Integer productState,Integer maintainType,Integer orderId,Integer projectId, String factoryId, String subFactoryId,String userid);


    /**
     * 根据条件参数分页获取符合条件的阴极板信息列表
     * @param productCode 阴极板编码,模糊查询,为null时不作为条件
     * @param productState 阴极板状态,为null时不作为条件
     * @param maintainType 维修类型,为null时不作为条件
     * @param orderId 订单id,查询范围为该订单下所有阴极板,为null时不作为条件
     * @param projectId 项目id,查询范围为该项目下所有阴极板,为null时不作为条件
     * @param factoryId 工厂id,查询范围为该工厂下所有阴极板,为null时不作为条件
     * @param subFactoryId 车间id,查询范围为该车间下所有阴极板,为null时不作为条件
     * @param userid 用户id,查询范围为用户所具有数据查看权限的所有工厂和车间范围内的阴极板,为null时不作为条件
     * @param page 页号
     * @param pageSize 页大小
     * @return
     */
    PageInfo<ProductVo> listProductInfo(String productCode, Integer productState,Integer maintainType,Integer orderId,Integer projectId, String factoryId, String subFactoryId,String userid, Integer page, Integer pageSize);

    /**
     * 无条件分页获取阴极板信息列表
     * @param page
     * @param pageSize
     * @return
     */
    PageInfo<ProductVo> listAllProductInfo(Integer page, Integer pageSize);

    /**
     * 根据code获取阴极板信息列表
     * @param productCode
     * @return
     */
    List<Product> listProductByCode(String productCode);

    /**
     * 根据code分页获取阴极板信息列表
     * @param productCode
     * @return
     */
    PageInfo<Product> listProductByCode(String productCode,Integer page, Integer pageSize);

    /**
     * 根据阴极板编码获取对应的阴极板信息
     * @param productCode
     * @return
     */
    ProductVo getProductInfoByCode(String productCode);

    /**
     * 目标阴极板是否被用户收藏
     * @param productCode
     * @return
     */
    boolean productIsCollected(String productCode, String userId);

//    @Deprecated
//    PagedResult query(ProductVo queryVo, Integer page, Integer pageSize);

    /**
     * 分页查询所有的Product表记录
     * @param page
     * @param pageSize
     * @return
     */
    PageInfo<Product> queryAll(Integer page, Integer pageSize);

    /**
     * 查询所有的Product表记录
     * @return
     */
    List<Product> queryAll();

    /**
     * 根据projectId找下属的阴极板信息
     * @param projectId
     * @return
     */
    PageInfo<SimpleProductDTO> queryByProjectId(String projectId, Integer page, Integer pageSize);


    /**
     * 更新阴极板信息
     * @param product
     * @throws Exception
     */
    void updateProduct(Product product) throws Exception;

    /**
     * 根据阴极板编码获取阴极板信息
     * @param scanCode 阴极板编码
     * @param userId 用户id
     * @param flag 是否添加搜索记录
     * @return
     */
    @Deprecated
    ProductVo getInfo(String scanCode, String userId, boolean flag);

    /**
     * 更新阴极板状态
     * @param productVo
     * @throws Exception
     */
    void updateState(ProductVo productVo) throws Exception;

    /**
     * 新增阴极板
     * @param product
     */
    void addProduct(Product product);

    /**
     * 阴极板删除
     * @param id
     */
    void deleteProduct(Integer id);

    /**
     * 返回阴极板编号在startProductCode~endProductCode之间的阴极板数量
     * @param startProductCode
     * @param endProductCode
     * @return
     */
    int checkCount(String startProductCode, String endProductCode);

    List<VerticalityData> getList();

    void copyData(List<Product> productList);

    /**
     * 生成startProductCode~endProductCode编码范围内数据库中不存在的阴极板对象
     * @param startProductCode
     * @param endProductCode
     * @return
     */
    List<Product> getAbsentList(String startProductCode, String endProductCode);

    /**
     * 批量添加阴极板
     * @param productList
     */
    void addProductList(List<Product> productList);

    /**
     * @TODO 可能是废弃接口，待确认删除
     * @param projectCode
     */
    void updateProductState(String projectCode);

//    ProductVo getProductCount(ProductVo queryVo);
//
//    List<ProductVo> getAllProductCounts(String userId);

    /**
     * 根据条件统计不同状态的阴极板的数量
     * @param productCode 阴极板编码(模糊查询),为null不做条件
     * @param productState 阴极板状态,为null不做条件
     * @param maintainType 维修类型,为null不做条件
     * @param factoryId 工厂id,为null不做条件
     * @param subFactoryId 车间id,为null不做条件
     * @param userid 用户id,查询用户拥有数据权限的范围内的数据,为null不做条件
     * @return
     */
    ProductCountVo getProductCount(String productCode, Integer productState,Integer maintainType, String factoryId, String subFactoryId,String userid);

    /**
     * 获取目标车间下所有状态的阴极板的数量统计
     * @param subFactoryId
     * @return
     */
    ProductCountVo getProductCountBySubFactoryId(String subFactoryId);

    /**
     * 获取目标工厂下所有状态的阴极板的数量统计
     * @param factoryId
     * @return
     */
    ProductCountVo getProductCountByFactoryId(String factoryId,String userId);

    /**
     * 获取用户拥有数据权限的所有工厂的阴极板的数量统计
     * 按工厂分别统计
     * @param userId
     * @return
     */
    List<ProductCountVo> getProductCountByUserId(String userId);

//    @Deprecated
//    ProductVo getClientProductCounts(String userId);

    List<ProductNumVo> getFactoryAndProductCount();

    Integer getUncodeNumBySubFactoryId(String subFactoryId);

    Integer getUncodeNumByFactoryId(String factoryId);

    /**
     * 获取所有超过阴极周期的阴极板
     * @return
     */
    List<Product> selectUpdateProduct();

    /**
     * 获取处于维修状态下的阴极板的维修数据
     * @param maintainType 维修类型
     * @param productCode 阴极板编码
     * @return
     */
    List<MaintainDataVo> selectProductMaintainData(Integer maintainType, String productCode);

    /**
     * 获取处于维修状态下的阴极板的维修数据(userid>subFactoryId>factoryId)
     * @param maintainType 维修类型
     * @param productCode 阴极板编码
     * @param factoryId 工厂ID((非空时搜索范围为工厂下所有车间对应的所有正在维修的阴极板))
     * @param subFactoryId 车间ID(非空时搜索范围为车间对应的所有正在维修的阴极板)
     * @param userId 用户ID(非空时搜索范围为用户拥有数据查看权限的车间对应的所有正在维修的阴极板)
     * @return
     */
    List<MaintainDataVo> selectProductMaintainData(Integer maintainType, String productCode, String factoryId, String subFactoryId,String userId);

    /**
     /**
     * 根据工厂ID获取对应工厂下所有车间的处于维修状态下的阴极板的维修数据
     * @param maintainType 维修类型
     * @param productCode 阴极板编码
     * @param factoryId 工厂ID
     * @return
     */
    List<MaintainDataVo> selectProductMaintainDataByFactoryId(Integer maintainType, String productCode, String factoryId);

    /**
     /**
     * 根据用户ID获取用户拥有数据查看权限的车间对应的所有正在维修的阴极板的维修数据
     * @param maintainType 维修类型
     * @param productCode 阴极板编码
     * @param userId 用户ID
     * @return
     */
    List<MaintainDataVo> selectProductMaintainDataByUserId(Integer maintainType, String productCode, String userId);

    /**
     /**
     * 根据车间ID获取对应车间的处于维修状态下的阴极板的维修数据
     * @param maintainType 维修类型
     * @param productCode 阴极板编码
     * @param subFactoryId 车间ID
     * @return
     */
    List<MaintainDataVo> selectProductMaintainDataBySubFactoryId(Integer maintainType, String productCode, String subFactoryId);

    /**
     * 根据编码获取对应阴极板记录
     * @param productCode
     * @return
     */
    Product getProductByCode(String productCode);

    /**
     * 添加用户搜索记录
     * @param productCode
     * @param userId
     */
    void insertSearchHistory(String productCode,String userId);
}
